"""
logging 库：记录相关日志
    1、logging：一共5个等级：debug < info < warning(警告) < error(错误) < critical(致命)
    2、记录器：logger，用来记录日志的记录器，只记录输出日志，不会处理存放日志
        (0) 直接使用logging记录日志时会默认创建一个名为”root“的记录器，默认等级为：warning，默认的处理器为：StreamHandler
        (1) 可以修改记录器的名称： logger = logging.getLogger("修改的名称")
        (2) 一般可以使用当前模块名来作为记录器名称：logger = logging.getLogger("__name__")
        (3) 可以修改记录器的记录的日志等级：logger.setLevel(logging.DEBUG)
        (4) logger.setLevel() : 设置日期记录器 处理日志信息的最低基本
        (5) logger.addHandle() : 为该日志记录器对象 添加一个handler对象
        (6) logger.removeHandle() : 移除该日志记录器的handler对象
        (7) logger.addFilter() : 为该日志记录器对象 添加一个filter对象
        (8) logger.removeFilter() :移除该日志记录器的filter对象
        (9) logger.debug() : 添加一个debug的信息
        (10) logger.info() : 添加一个info的信息
        (11) logger.warning() : 添加一个warning的信息
        (12) logger.error() : 添加一个error的信息
        (13) logger.critical() () : 添加一个critical的信息

    3、处理器：handler，用来存放/处理logger记录的日志，常用的处理器如下：默认等级为warning
        (1) StreamHandler：标准流处理器，将消息发送到终端（即会在命令行窗口输出日志）
        (2) FileHandler ：文件处理器，将消息记录到指定文件  --常用
        (3) RotatingFileHandler ：文件处理器，文件达到指定大小后，启用新文件存储日志，并支持日志文件按大小切割
        (4) TimedRotatingFileHandler ：文件处理器，日志以特定的时间间隔轮换日志文件，并支持日志文件按时间切割
        (5) SMTPHandler ：将日志消息发送给一个指定的email地址

        (1) handler.setLevel() :
        (2) handler.setFormatter() :
        (3) handler.addFilter() :
        (4) handler.removeFilter() :

        (5)可以修改处理器的日志等级：FileHandler.setLevel(logging.DEBUG)

    4、格式器：formatter，控制handle处理器存放/处理logger记录的日志的格式，
        (0) 通过 logging.Formatter() 创建实例对象，设置记录日志的格式
        # 日志记录格式如下：
        (1) %(asctime)s ： 创建日志的时间，默认时间格式为：年-月-日 时：分：秒,毫秒
        (2) %(name)s ： 用户记录日志的记录器名称
        (3) %(levelname)s ：日志的等级/级别，（DEBUG、INFO、WARNING、ERROR、CRITICAL）
        (4) %(message)s ： 日志消息
        (4) %(process)d ： 触发日志的进程id
        (6) %(thread)d ： 触发日志的线程id
        (7 )%(filename)s : 触发日志的文件
        (8) %(lineno)d : 触发日志的行数

    5、logging.basicConfig()方法：
        (1) 默认创建一个root记录器
        (2) 设置root的日志级别为warning
        (3) 为root记录器添加StreamHandler处理器
        (4) 为处理器设置一个简单的格式

    6、logging.basicConfig(*kwargs)，接收关键词，可以修改默认配置，可接收以下参数
        (1) filename : 指定日志输出目标文件的文件名
        (2) filemode : 指定日志文件的打开模式，默认为“a”，注意：需filename被指定时才生效
        (3) format : 指定日志的格式字符串
        (4) datefmt : 指定日志记录中的日期和时间的格式，注意：需format中包含时间字段-%(asctime)时才生效
        (5) level : 指定日志器的日志级别
        (6) stream : 指定日志输出目标stream，如 sys.stdout,sys.stderr,网络stream，注意：stream和filename不能同时提供，否则会报ValueError错
        (7) style : 指定format格式字符串的风格，可取值“%”，“{”，“$”,默认是“%”
        (8) handlers : 创建了多个handler的可迭代对象，这些handler将会被添加到 root logger，注意：filename，stream，handlers只能存在一个，不能同时出现2个或三个，否则会报ValueError错


    7、下载ideolog插件，支持log文件类型
"""
import logging
import colorlog
# logging调用的函数最低等级是warning，低于warning等级的信息不会被输出，可以通过logging.basicConfig()修改默认配置
# 直接调用logging输出日志是：默认把日志输出到标准输出流，就是只在命令行窗口输出

# ---------记录器
# logger对象是指创建记录日志的记录器，参数为自定义命名的记录器名称
logger = logging.getLogger("记录器(logger)")    # 修改记录器的名称，命名为mao_logger
# logger默认的日志等级为warning，可以修改记录器的日志等级
logger.setLevel(logging.DEBUG)    # 修改记录器的日志等级为debug

#  --------处理器
# 创建文件处理器fileHandler对象,存放输出的日志到指定文件中
fhandle = logging.FileHandler("log11.log", encoding="utf-8")
# handle 的日志等级，默认为warning，可以修改存放日志的等级
fhandle.setLevel(logging.DEBUG)

# 设置日志的格式
format = '%(asctime)s [%(name)s] [line:%(lineno)d] %(levelname)s -- %(message)s'
set_format = logging.Formatter(format)
fhandle.setFormatter(set_format)

# # 给记录器增加处理器
logger.addHandler(fhandle)

# 日志内容
logger.debug("debug时候的信息")
logger.info("info时候的信息")
logger.warning("warning时候的信息,这里是橙色")
logger.error("error时候的信息，这里是红色")
logger.critical("critical时候的信息")


#
# # -----------格式器
# # 设置日志的格式
# # %(asctime)s ： 创建日志的时间，默认时间格式为：年-月-日 时：分：秒,毫秒
# # %(name)s ： 用户记录日志的记录器名称
# # %(levelname)s ：日志的等级/级别，（DEBUG、INFO、WARNING、ERROR、CRITICAL）
# # %(message)s ： 日志消息
# # %(process)d ： 触发日志的进程id
# # %(thread)d ： 触发日志的线程id
#
# lc = {'DEBUG': 'cyan', 'INFO': 'green', 'WARNING': 'yellow', 'ERROR': 'red', 'CRITICAL': 'blue'}
#
# # 设置记录日志的格式
# # formatter = colorlog.ColoredFormatter(
# #     '%(log_color)s %(asctime)s -- %(name)s -- %(filename)s [line:%(lineno)d]-- %(levelname)s -- %(message)s',
# #     log_colors={'DEBUG': 'cyan', 'INFO': 'green', 'WARNING': 'yellow', 'ERROR': 'red', 'CRITICAL': 'red,bg_white'},
# #     style='%'
# # )
# # 2024-01-22 21:20:58,284 -- 记录器(logger) -- logging库-知识.py [line:89]-- CRITICAL -- critical 信息
# format = '%(asctime)s -- %(name)s  -- %(levelname)s -- %(message)s'
# formatter = logging.Formatter(format)
#
# # color_formatter = colorlog.ColoredFormatter(
# #     format,
# #     log_colors=lc
# # )
#
#
# # 设置文件处理器记录日志的格式
# fhandle.setFormatter(formatter)
#
# # 给记录器增加处理器
# logger.addHandler(fhandle)
#
# # 日志内容
# logger.debug("debug时候的信息")
# logger.info("info时候的信息")
# logger.warning("warning时候的信息")
# logger.error("error时候的信息")
# logger.critical("critical时候的信息")
#
#
# #
# # logging.basicConfig()

logger = logging.getLogger("猫猫记录器")  # 创建记录器 实例对象
logger.setLevel(logging.DEBUG)  # 设置记录器 会记录的最低等级的日志是info （默认是warning）

mao_ft = "%(asctime)s [%(name)s] [line:%(lineno)d] %(levelname)s -- %(message)s"  # 设置格式：记录触发时间、记录器名称、触发的行数、日志等级名称、日志内容等
mao_format = logging.Formatter(mao_ft)  # 创建格式器 实例对象
#
handle = logging.FileHandler("猫猫日志.log", encoding="utf-8")  # 创建处理器 实例对象
handle.setLevel(logging.DEBUG)  # 设置处理器 会处理的最低等级的日志是info（默认是warning）

handle.setFormatter(mao_format)  # 给处理器 设置格式器
logger.addHandler(handle)   # 给记录器 添加 处理器